﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace leviathan.puzzle
{
    /// <summary>
    /// Puzzle Osztály
    /// </summary>
    public class PuzzleClass
    {
        // Rejtvény adatai
        private string desc;
        private string answer;
        private Int16 xp;
        private List<string> possib;
        private string type;
        private int tries;
        private int helpc;

        //Form
        private System.Windows.Forms.Form form;

        // Státusz
        private supervisor.Supervisor.SearchState status;

        /// <summary>
        /// Puzzle Osztály konstruktora
        /// </summary>
        /// <param name="str">Rejtvény típus neve.</param>
        public PuzzleClass(string str, System.Windows.Forms.Form form1)
        {
            possib = new List<string>();
            loadComponents(str);
            status = supervisor.Supervisor.SearchState.inner;
            form = form1;
            tries = 3;
            helpc = 0;
        }

        /// <summary>
        /// Aktuális rejtvény betöltése.
        /// </summary>
        /// <param name="str">Rejtvény neve</param>
        private void loadComponents(string str)
        {
            type = str;
            if (System.IO.File.Exists("../../Defaults/Puzzle/" + str + ".puz"))
            {
                using (System.IO.StreamReader sr = new System.IO.StreamReader("../../Defaults/Puzzle/" + str + ".puz"))
                {
                    desc = sr.ReadLine();                   //Leírás
                    answer = sr.ReadLine();                 //Helyes megoldás
                    xp = Convert.ToInt16(sr.ReadLine());    //Xp ha sikeres
                    while (!sr.EndOfStream)                 //Válasz lehetőségek
                    {
                        possib.Add(sr.ReadLine());
                    }
                    sr.Close();
                }
            }
            else
            {
                System.Windows.Forms.MessageBox.Show("Hiányzó fájl! (Puzzle)", "Hiba!");
                return;
            }
        }

        /// <summary>
        /// Esemény kiválasztására szolgáló metódus
        /// </summary>
        /// <param name="i">A megoldási érték, amit ki kell értékelni.</param>
        public void answerTry(string s)
        {
            if (s == answer)
            {
                status = supervisor.Supervisor.SearchState.endSuccess;
                form.SendToBack();
                form.Close();
            }
            else
            {
                if (tries <= 1)
                {
                    idk();
                }
                --tries;
                desc += Environment.NewLine + "Sikertelen próbálkozás. Még " + tries + " lehetőséged van.";
            }
        }

        public void idk()
        {
            status = supervisor.Supervisor.SearchState.endFail;
            form.SendToBack();
            form.Close();
        }

        public void needHelp(ref System.Windows.Forms.TextBox tb)
        {
            tb.Text += "Segítség " + helpc+1 + ": " + Environment.NewLine;
            tb.Text += possib[helpc++] + Environment.NewLine;
            if (helpc >= possib.Count)
                helpc = 0;
        }

        /// <summary>
        /// Search státusz lekérdezésére szolgáló metódus
        /// </summary>
        /// <returns>supervisor.Supervisor.SearchState</returns>
        public supervisor.Supervisor.SearchState getState()
        {
            return status;
        }

        public string getDesc()
        {
            return desc;
        }

        public Int16 getXp()
        {
            return xp;
        }
    }
}
